/**
 * 
 * @author Kassio Kiarelly Soares de Oliveira <kassiokiarelly@gmail.com>
 * @author Pablo Veinberg Soares de Oliveira <pveinberg@gmail.com>
 * 
 *
 **/
package Dao;

import Modelo.Reserva;
import Util.Utils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class DaoReserva extends Dao<Reserva> {

    @Override
    public List<Reserva> findAll() {
        return getRepositorio().getReservas();
    }

    @Override
    public Reserva find(Object key) {
        List<Reserva> reservas = this.findAll();
        for (Reserva temp : reservas) {
            if (temp.getId() == (Integer) key) {
                return temp;
            }
        }
        return null;
    }

    @Override
    public boolean remove(Reserva obj) {
        Reserva temp = find(obj.getId());
        boolean remove = getRepositorio().getReservas().remove(temp);
        salvarRepositorio();
        return remove;
    }

    @Override
    public boolean add(Reserva obj) {
        List<Reserva> lista = this.getRepositorio().getReservas();
        int indice = (lista.size()) - 1;

        if (indice >= 0) {
            obj.setId(lista.get(indice).getId() + 1);
        } else {
            obj.setId(1);
        }

        boolean add = getRepositorio().getReservas().add(obj);
        salvarRepositorio();
        return add;
    }

    @Override
    public void edit(Reserva obj) {
        try {
            Reserva temp = this.find(obj.getId());
            temp.getData(obj);
            salvarRepositorio();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    //funcao que verifica se o quarto estara disponivel ou nao em um intervalo de tempo
    //para poder efetuar a reserva de um quarto
    // verifica também as pendências do hospede
    public synchronized int verificaSePodeReservarQuarto(Reserva r) {

        // verifica disponibilidade do quarto nas datas 
        int r1, r2, r3, r4; //resultado das comparacoes                
        for (Reserva reserva : getRepositorio().getReservas()) {
            
            // não compara quando é a mesma reserva (permite atualizar as datas)
            if (reserva.getId() != r.getId()) {
                //se a reserva tiver sido feita no quarto selecionado vamos verificar as datas
                if (reserva.getQuarto().equals(r.getQuarto())) {
                    r1 = r.getInicio().compareTo(reserva.getInicio());
                    r2 = r.getInicio().compareTo(reserva.getFim());
                    r3 = r.getFim().compareTo(reserva.getInicio());
                    r4 = r.getFim().compareTo(reserva.getFim());

                    if (r1 >= 0 && r2 <= 0) {
                        return Utils.QUARTO_OCUPADO;
                    }

                    if (r3 >= 0 && r4 <= 0) {
                        return Utils.QUARTO_OCUPADO;
                    }
                }            
            }
        }
        // verifica pendências do hospede                   
        if (r.getHospede().getSaldo() != 0) {
            return Utils.USUARIO_SEM_SALDO;
        } 
        
        return Utils.SUCESSO;
    }

    public List<Reserva> findReservasDeHoje() {
        List<Reserva> reservas = new ArrayList<Reserva>();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

        for (Reserva r : this.findAll()) {
            System.out.println(sdf.format(r.getInicio()) + " > " + sdf.format(new Date()));
            if (sdf.format(r.getInicio()).equals(sdf.format(new Date()))) {
                reservas.add(r);
            }
        }

        return reservas;
    }

    public List<Reserva> findReservasAtrasadas() {
        List<Reserva> reservas = new ArrayList<Reserva>();

        for (Reserva r : this.findAll()) {
            if (r.getInicio().before(new Date())) {
                reservas.add(r);
            }
        }

        return reservas;
    }

    public List<Reserva> findReservasPendentes() {
        List<Reserva> reservas = new ArrayList<Reserva>();

        for (Reserva r : this.findAll()) {
            if (r.getInicio().after(new Date())) {
                reservas.add(r);
            }
        }

        return reservas;
    }
}
